<template>
  <a-spin :spinning="confirmLoading">
    <j-form-container :disabled="formDisabled">
      <!-- 主表单区域 -->
      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
        <span style="color: red;">说明：单位：元
        </span>
        <a-row>
          <!--          <a-col :xs="24" :sm="12">-->
          <!--            <a-form-model-item label="单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="unit">-->
          <!--              <j-dict-select-tag type="list" v-model="model.unit" dictCode="unit" placeholder="请选择单位" />-->
          <!--            </a-form-model-item>-->
          <!--          </a-col>-->
          <a-col :xs="12" :sm="12">
            <a-form-model-item label="年度" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="year">
              <j-dict-select-tag type="list" v-model="model.year" dictCode="year" placeholder="请选择年度"
                @change="handleYearChange" />
            </a-form-model-item>
          </a-col>
        </a-row>
      </a-form-model>
    </j-form-container>
    <!-- 子表单区域 -->
    <a-tabs v-model="activeKey" @change="handleChangeTabs">
      <a-tab-pane tab="离休人员工资及保险明细表" :key="refKeys[0]" :forceRender="true">
        <j-editable-table :ref="refKeys[0]" :loading="cwLxrygzjbxmxbTable.loading"
          :columns="cwLxrygzjbxmxbTable.columns" :dataSource="cwLxrygzjbxmxbTable.dataSource" :maxHeight="300"
          :disabled="formDisabled" :rowNumber="true" :rowSelection="true" :actionButton="true"
          @valueChange="handleValueChange" />
      </a-tab-pane>
    </a-tabs>
  </a-spin>
</template>

<script>
import { mapState } from 'vuex'
import { FormTypes, getRefPromise, VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil'
import { JEditableTableModelMixin } from '@/mixins/JEditableTableModelMixin'
import { validateDuplicateValue } from '@/utils/util'
import { getAction } from '@/api/manage'

export default {
  name: 'CwLxrygzjbxmxbTjForm',
  mixins: [JEditableTableModelMixin],
  components: {},
  data() {
    return {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 5 },
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 },
      },
      model: { year: '' }, // 初始为空，由watch同步全局年度
      validatorRules: {
        unit: [
          { required: true, message: '请输入单位!' },
        ],
        year: [
          { required: true, message: '请输入年度!' },
        ],
      },
      addDefaultRowNum: 1,
      refKeys: ['cwLxrygzjbxmxb'],
      tableKeys: ['cwLxrygzjbxmxb'],
      activeKey: 'cwLxrygzjbxmxb',
      confirmLoading: false,
      // 离休人员工资及保险明细表
      cwLxrygzjbxmxbTable: {
        loading: false,
        dataSource: [],
        columns: [
          // {
          //   title: '财政/非财政',
          //   key: 'czFcz',
          //   type: FormTypes.select,
          //   dictCode: "cz_fcz",
          //   width: "200px",
          //   placeholder: '请输入${title}',
          //   defaultValue: '',
          // },
          {
            title: '姓名',
            key: 'name',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '',
            validateRules: [{ required: true, message: '${title}不能为空' }],
          },
          {
            title: '职务（职称）',
            key: 'zc',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '',
          },
          {
            title: '基本离退休费',
            key: 'jblxf',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '06年前增加的生活费',
            key: 'nqzj',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '06年后增加的生活费',
            key: 'nhzj',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '2021年增加的生活费（工资补贴）',
            key: 'npzjdshf',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '独生子女加发5%',
            key: 'dsznjf',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '离休生活补贴',
            key: 'lxshbt',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '加发5%补贴',
            key: 'jf',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '教龄满30年加发',
            key: 'jlm',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '特殊岗位津贴',
            key: 'tsgwjt',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '卫生费',
            key: 'wsf',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '特贡加发',
            key: 'tgjf',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '劳模荣誉津贴',
            key: 'lmyyjt',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '2021年增加的生活补贴',
            key: 'nzjdshbt',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '护理费',
            key: 'nursingFee',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '2024年增加基本离休费',
            key: 'zjjblxf',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '年加发工资',
            key: 'njfgz',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          {
            title: '取暖费',
            key: 'heatingFee',
            type: FormTypes.input,
            width: "200px",
            placeholder: '请输入${title}',
            defaultValue: '0.0',
            validateRules: [
              {
                // 修改后的正则：仅允许非负数字，支持整数或最多2位小数
                pattern: /^\d+(\.\d{1,2})?$/,
                message: "${title}格式不正确，仅支持非负整数或最多2位小数"
              }
            ],
          },
          // 在columns数组的适当位置添加以下计算字段
          {
            title: '住房提租补贴',
            key: 'zftzbt',
            type: FormTypes.input,
            width: "200px",
            placeholder: '自动计算',
            defaultValue: '0.0',
            disabled: true, // 禁止手动输入
            validateRules: [{
              pattern: /^\d+(\.\d{1,2})?$/,
              message: "${title}格式不正确"
            }]
          },
          {
            title: '月应发工资合计',
            key: 'yyfgzhj',
            type: FormTypes.input,
            width: "200px",
            placeholder: '自动计算',
            defaultValue: '0.0',
            disabled: true,
            validateRules: [{
              pattern: /^\d+(\.\d{1,2})?$/,
              message: "${title}格式不正确"
            }]
          },
          {
            title: '年应发工资合计',
            key: 'nyfgzhj',
            type: FormTypes.input,
            width: "200px",
            placeholder: '自动计算',
            defaultValue: '0.0',
            disabled: true,
            validateRules: [{
              pattern: /^\d+(\.\d{1,2})?$/,
              message: "${title}格式不正确"
            }]
          },
          {
            title: '养老保险基数（年）',
            key: 'ylbxjs',
            type: FormTypes.input,
            width: "200px",
            placeholder: '自动计算',
            defaultValue: '0.0',
            disabled: true,
            validateRules: [{
              pattern: /^\d+(\.\d{1,2})?$/,
              message: "${title}格式不正确"
            }]
          },
          {
            title: '养老保险（72%）',
            key: 'ylbx',
            type: FormTypes.input,
            width: "200px",
            placeholder: '自动计算',
            defaultValue: '0.0',
            disabled: true,
            validateRules: [{
              pattern: /^\d+(\.\d{1,2})?$/,
              message: "${title}格式不正确"
            }]
          },
          {
            title: '预计社保返还资金',
            key: 'yjsbhfzj',
            type: FormTypes.input,
            width: "200px",
            placeholder: '自动计算',
            defaultValue: '0.0',
            disabled: true,
            validateRules: [{
              pattern: /^\d+(\.\d{1,2})?$/,
              message: "${title}格式不正确"
            }]
          }
        ]
      },
      url: {
        add: "/cw/cwLxrygzjbxmxbTj/add",
        edit: "/cw/cwLxrygzjbxmxbTj/edit",
        cwLxrygzjbxmxb: { list: '/cw/cwLxrygzjbxmxbTj/queryCwLxrygzjbxmxbByMainId' },
        getByYear: '/cw/cwLxrygzjbxmxbTj/list' // 复用体检表的年度查询接口，后续可自行修改
      },
      isManualChange: false // 标记是否手动修改过表单年度
    }
  },
  props: {
    disabled: {
      type: Boolean,
      default: false,
      required: false
    },
    scene: { // 接收 Modal 传递的场景值
      type: String,
      default: ''
    }
  },
  computed: {
    formDisabled() {
      return this.disabled
    },
    ...mapState({ globalYear: state => state.app.globalYear })
  },
  watch: {
    // 监听全局年度变化，同步到表单（仅当未手动修改时）
    globalYear(newVal) {
      if (!this.isManualChange) {
        this.model.year = newVal
        // 可选：自动触发年度查询，解开注释即可
        // this.handleYearChange(newVal)
      }
    },
    // 监听表单年度变化，标记是否手动修改
    'model.year'(newVal, oldVal) {
      if (oldVal && newVal !== this.globalYear) {
        this.isManualChange = true // 手动修改后，不再同步全局年度
      }
    }
  },

  created() {
    // 初始化时同步全局年度
    this.model.year = this.globalYear
    const scene = this.scene; // 接收 Modal 传递的 scene（add/edit）
    this.currentScene = scene; // 存储到本地变量，后续复用
    console.log(scene)
    if (scene=='add'){
      this. handleYearChange(this.model.year)
    }
  },
  methods: {
    // 处理值变化事件，实现自动计算
    handleValueChange(event) {
      const { type, row, column, value, target } = event;

      // 定义需要触发计算的字段列表
      const numericFields = [
        'jblxf', 'nqzj', 'nhzj', 'npzjdshf', 'dsznjf', 'lxshbt',
        'jf', 'jlm', 'tsgwjt', 'wsf', 'tgjf', 'lmyyjt',
        'nzjdshbt', 'nursingFee', 'zjjblxf', 'njfgz', 'heatingFee'
      ];

      if (numericFields.includes(column.key)) {
        // 添加延迟确保值已完全更新
        setTimeout(() => {
          this.calculateRowValues(target, row.rowId || row.id);
        }, 10);
      }
    },

    // 计算行数据的所有自动计算字段
    calculateRowValues(tableInstance, rowId) {
      // 健壮性检查
      if (!tableInstance || !rowId) {
        console.warn('计算参数不完整', { tableInstance, rowId });
        return;
      }

      try {
        const allValues = tableInstance.getValuesSync({ validate: false }).values;
        const currentRow = allValues.find(item => (item.id === rowId) || (item.rowId === rowId));

        if (!currentRow) {
          console.warn('未找到对应的行数据:', rowId);
          return;
        }

        // 转换为数字，处理空值
        const toNumber = (val) => {
          if (val === '' || val == null) return 0;
          return parseFloat(val) || 0;
        };

        // 提取各个字段的值
        const jblxf = toNumber(currentRow.jblxf); // 基本离退休费
        const nqzj = toNumber(currentRow.nqzj); // 06年前增加的生活费
        const nhzj = toNumber(currentRow.nhzj); // 06年后增加的生活费
        const npzjdshf = toNumber(currentRow.npzjdshf); // 2021年增加的生活费（工资补贴）
        const dsznjf = toNumber(currentRow.dsznjf); // 独生子女加发5%
        const lxshbt = toNumber(currentRow.lxshbt); // 离休生活补贴
        const jf = toNumber(currentRow.jf); // 加发5%补贴
        const jlm = toNumber(currentRow.jlm); // 教龄满30年加发
        const tsgwjt = toNumber(currentRow.tsgwjt); // 特殊岗位津贴
        const wsf = toNumber(currentRow.wsf); // 卫生费
        const tgjf = toNumber(currentRow.tgjf); // 特贡加发
        const lmyyjt = toNumber(currentRow.lmyyjt); // 劳模荣誉津贴
        const nzjdshbt = toNumber(currentRow.nzjdshbt); // 2021年增加的生活补贴
        const nursingFee = toNumber(currentRow.nursingFee); // 护理费
        const zjjblxf = toNumber(currentRow.zjjblxf); // 2024年增加基本离休费
        const njfgz = toNumber(currentRow.njfgz); // 年加发工资
        const heatingFee = toNumber(currentRow.heatingFee); // 取暖费

        // 1. 计算住房提租补贴
        const zftzbt = (jblxf + nqzj + nhzj + npzjdshf + dsznjf + lxshbt + jf + jlm + tsgwjt + wsf + tgjf) * 0.13;

        // 2. 计算月应发工资合计
        const yyfgzhj = jblxf + nqzj + nhzj + npzjdshf + dsznjf + lxshbt + jf + jlm + tsgwjt + wsf + tgjf + lmyyjt + nzjdshbt + nursingFee + zftzbt + zjjblxf;

        // 3. 计算年应发工资合计
        const nyfgzhj = yyfgzhj * 12 + njfgz;

        // 4. 计算养老保险基数（年）
        const ylbxjs = (yyfgzhj - zftzbt) * 12 + njfgz;

        // 5. 计算养老保险（72%）
        const ylbx = ylbxjs * 0.72;

        // 6. 预计社保返还资金（等于养老保险基数）
        const yjsbhfzj = ylbxjs;

        // 构建更新对象
        const updateValues = {
          zftzbt: this.formatNumber(zftzbt),
          yyfgzhj: this.formatNumber(yyfgzhj),
          nyfgzhj: this.formatNumber(nyfgzhj),
          ylbxjs: this.formatNumber(ylbxjs),
          ylbx: this.formatNumber(ylbx),
          yjsbhfzj: this.formatNumber(yjsbhfzj)
        };

        // 使用setValues方法更新行数据[1](@ref)
        tableInstance.setValues([
          {
            rowKey: rowId,
            values: updateValues
          }
        ]);

      } catch (error) {
        console.error('计算过程中发生错误:', error);
      }
    },

    // 格式化数字，保留2位小数
    formatNumber(value) {
      if (isNaN(value) || value == null) return '0.00';
      return parseFloat(value).toFixed(2);
    },

    // 修改editAfter方法，确保编辑时也触发计算
    editAfter() {
      this.$nextTick(() => {
        // 确保DOM更新完成后触发计算
        setTimeout(() => {
          this.forceCalculateAllRows();
        }, 100);
      });

      if (this.model.id) {
        let params = { id: this.model.id };
        getAction(this.url.cwLxrygzjbxmxb.list, params).then(res => {
          if (res.success) {
            this.cwLxrygzjbxmxbTable.dataSource = res.result.records || [];

            // 数据设置完成后，强制触发所有行的计算
            this.$nextTick(() => {
              setTimeout(() => {
                this.forceCalculateAllRows();
              }, 200);
            });
          }
        }).finally(() => {
          this.cwLxrygzjbxmxbTable.loading = false;
        });
      }
    },

    // 新增方法：强制计算所有行数据
    forceCalculateAllRows() {
      const tableInstance = this.$refs[this.refKeys[0]];
      if (!tableInstance || !tableInstance.getValuesSync) {
        console.warn('表格实例未就绪，重试中...');
        setTimeout(() => this.forceCalculateAllRows(), 100);
        return;
      }

      try {
        const { values } = tableInstance.getValuesSync({ validate: false });
        if (values && values.length > 0) {
          values.forEach((row, index) => {
            const rowId = row.id || row.rowId;
            if (rowId) {
              // 短暂延迟确保行数据完全渲染
              setTimeout(() => {
                this.calculateRowValues(tableInstance, rowId);
              }, index * 50);
            }
          });
        }
      } catch (error) {
        console.error('强制计算失败:', error);
      }
    },
    addBefore() {
      this.cwLxrygzjbxmxbTable.dataSource = []
    },
    getAllTable() {
      let values = this.tableKeys.map(key => getRefPromise(this, key))
      return Promise.all(values)
    },
    // editAfter() {
    //   this.$nextTick(() => { })
    //   if (this.model.id) {
    //     let params = { id: this.model.id }
    //     getAction(this.url.cwLxrygzjbxmxb.list, params).then(res => {
    //       if (res.success) {
    //         this.cwLxrygzjbxmxbTable.dataSource = res.result.records || []
    //       }
    //     }).finally(() => {
    //       this.cwLxrygzjbxmxbTable.loading = false
    //     })
    //   }
    // },
    validateSubForm(allValues) {
      return new Promise((resolve, reject) => {
        Promise.all([]).then(() => {
          resolve(allValues)
        }).catch(e => {
          if (e.error === VALIDATE_NO_PASSED) {
            this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index]
          } else {
            console.error(e)
          }
        })
      })
    },
    classifyIntoFormData(allValues) {
      let main = Object.assign(this.model, allValues.formValue)
      return {
        ...main,
        cwLxrygzjbxmxbList: allValues.tablesValue[0].values,
      }
    },
    validateError(msg) {
      this.$message.error(msg)
    },
    close() {
      this.visible = false
      this.$emit('close')
      if (this.$refs.form) {
        this.$refs.form.clearValidate();
      }
    },
    async handleYearChange(year) {
      // 清空逻辑：未选择年度时，保留单位，清空其他数据
      if (!year) {
        this.model = { unit: this.model.unit }
        this.cwLxrygzjbxmxbTable.dataSource = []
        return
      }

      // 加载状态：主表+子表同时加载
      this.confirmLoading = true
      this.cwLxrygzjbxmxbTable.loading = true

      try {
        // 1. 调用年度查询接口
        const yearResponse = await getAction(this.url.getByYear, { year })

        if (yearResponse.success && yearResponse.result.records.length > 0) {
          const mainRecord = yearResponse.result.records[0]
          // 主表数据回显：保留用户已选的unit和year，合并接口返回的其他字段
          this.model = {
            ...this.model,
            ...mainRecord
          }

          // 2. 使用返回的mainId调用明细表列表接口
          if (mainRecord.id) {
            const detailResponse = await getAction(this.url.cwLxrygzjbxmxb.list, {
              id: mainRecord.id
            })

            if (detailResponse.success) {
              this.cwLxrygzjbxmxbTable.dataSource = detailResponse.result.records || []
            } else {
              this.$message.warning('获取明细表数据失败：' + (detailResponse.message || '未知错误'))
              this.cwLxrygzjbxmxbTable.dataSource = []
            }
          } else {
            this.$message.warning('未获取到明细表关联ID，无法加载明细数据')
            this.cwLxrygzjbxmxbTable.dataSource = []
          }
        } else {
          // 接口返回失败（如无数据），显示警告并清空子表
          this.$message.warning(yearResponse.message || '该年度暂无数据')
          this.cwLxrygzjbxmxbTable.dataSource = []
          this.model.id = undefined;

        }
      } catch (error) {
        // 异常处理
        console.error('查询接口异常：', error)
        this.$message.error('查询失败，请刷新页面重试或联系管理员')
        this.cwLxrygzjbxmxbTable.dataSource = []
      } finally {
        // 关闭加载状态（无论成功/失败）
        this.confirmLoading = false
        this.cwLxrygzjbxmxbTable.loading = false
      }
    }
  }
}
</script>

<style scoped></style>